﻿#ifndef __SOCK_DEF_H__
#define __SOCK_DEF_H__
#include "ssNetBase.h"
#include "../container/ssBuffer.h"

namespace StarSeeker
{
union SockAddr_u
{
	sockaddr		addr;
	sockaddr_in		addrin;
	sockaddr_in6	addrin6;
};

//////////////////////////////SOCKET鸡肋//////////////////////////////////
class ssSocket
{
public:
	// 构造和析构
	ssSocket();
	virtual ~ssSocket();

	// 基本信息操作
	void Attach(SOCKET s, SockAddr_u& addr, u32 session);
	void Detach();

	u32 GetSession() const;
	SOCKET GetSocket() const;
	bool IsInvalidSocket() const;
	void CloseSocket();
	bool IsIPv6() const;
protected:
	// 基本信息
	u32				m_session;
	SOCKET			m_socket;
	SockAddr_u		m_addr;
};
///////////////////////////////////////////////////////////////////////////
////////////////////////////服务端的SOCKET//////////////////////////////////
class ssAcceptSocket : public ssSocket
{
public:
	//设置缓冲大小
	void InitBuffer(u32 sendSize, u32 recvSize);
	//发送，然后清空发送缓存
	int SendBuffer();
	//接收，需要手动清空缓存
	int RecvBuffer();

public:
	ssBuffer		m_recvBuf;
	ssBuffer		m_sendBuf;
};
///////////////////////////////////////////////////////////////////////////
//////////////////////////////客户端的SOCKET////////////////////////////////
class ssClientSocket : public ssAcceptSocket
{
public:
	ssClientSocket();

	bool32 Connect(bool v6, u32 session, const char* ip, u16 port);

	time_t m_createTime;
};
///////////////////////////////////////////////////////////////////////////
////////////////////////////监听用的SOCKET//////////////////////////////////
class ssListenSocket : public ssSocket
{
public:
	bool32 Listen(bool v6, u32 session, const char* ip, u16 port);
	SOCKET Accept();
	ssAcceptSocket Accept2(u32 session);
};
///////////////////////////////////////////////////////////////////////////
}
#endif
